package com.xj.algorithm.leetcode;

/**
 * 数字转换为十六进制数
 */
public class L405_16进制转化 {

    /**
     * 给定一个整数，编写一个算法将这个数转换为十六进制数。对于负整数，我们通常使用 补码运算 方法。
     * <p>
     * 注意:
     * <p>
     * 十六进制中所有字母(a-f)都必须是小写。
     * 十六进制字符串中不能包含多余的前导零。如果要转化的数为0，那么以单个字符'0'来表示；对于其他情况，十六进制字符串中的第一个字符将不会是0字符。 
     * 给定的数确保在32位有符号整数范围内。
     * 不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。
     * 示例 1：
     * <p>
     * 输入:
     * 26
     * <p>
     * 输出:
     * "1a"
     * 示例 2：
     * <p>
     * 输入:
     * -1
     * <p>
     * 输出:
     * "ffffffff"
     */
    public static void main(String[] args) {
        System.out.println(toHexGood(26));
        System.out.println(toHexGood(-1));
    }

    //自己的解法：直接调用库函数
    public static String toHex(int num) {
        return Integer.toHexString(num);
    }

    //精彩解法：位运算，每4位进行处理
    public static String toHexGood(int num) {
        char[] hex = "0123456789abcdef".toCharArray();
        String s = new String();
        while (num != 0) {
            int end = num & 15;
            s = hex[end] + s;
            //无符号右移
            num >>>= 4;
        }
        if (s.length() == 0) {
            s = "0";
        }
        return s;
    }
}
